package argo.hot100.recall;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Permute {

    public List<List<Integer>> permute(int[] nums) {

        List<List<Integer>> res = new ArrayList<>();

        if (nums == null || nums.length == 0) {
            return res;
        }

        List<Integer> subres = new ArrayList<>();
        boolean[] visited = new boolean[nums.length];
        dfs(nums, res, subres, visited, 0);
        return res;
    }

    public void dfs(int[] nums, List<List<Integer>> res, List<Integer> subres, boolean[] visited, int depth) {
        if (depth == nums.length) {
            res.add(new ArrayList<>(subres));
            return;
        }

        for (int i = 0; i < nums.length; i++) {
            if (!visited[i]) {

                visited[i] = true;
                subres.add(nums[i]);

                dfs(nums, res, subres, visited, depth + 1);

                // 注意：下面这两行代码发生 「回溯」，回溯发生在从 深层结点 回到 浅层结点 的过程，代码在形式上和递归之前是对称的
                visited[i] = false;
                //移除末尾元素，此处不能用subres[i]，其在回溯出栈过程中是和入栈相反的，下标回路不一致！
                subres.remove(subres.size() - 1);

            }
        }

    }
}
